<?php
/**
 * 这是一个SQLite导入数据的示例，通过命令行，导入两个CSV文件
 * User: ford
 * Date: 15-6-23
 * Time: 下午1:59
 */
if($argc != 3) {
	die("USAGE: sqliteadd.php <table_name> <file name>\n");

}
$table_name = $argv[1];
$file_name = $argv[2];
$row_num = 0;

/**
 * 这个函数用于创建数据插入语句
 * 以prepare方式插入，主要在于统计字段数量
 * @param $table 数据表名
 * @param $ncols 列数，字段数
 * @return string 数据插入语句
 */
function create_insert_stmt($table, $ncols) {
	$stmt = "INSERT INTO $table VALUES(";
	foreach(range(1,$ncols) as $i) {		//创建一个1到字段总数的数组，将数组中的元素（序号）逐个显示
		$stmt .= ":$i,";
	}

	$stmt = preg_replace("/,$/", ')', $stmt);	//用正则表达式搜索并替换结尾
	return $stmt;
}

try {
	$db = new SQLite3("scott.sqlite");		//打开数据库
	$res = $db->query("SELECT * FROM $table_name");	//执行查询
	if($db->lastErrorCode() != 0) {
		throw new Exception($db->lastErrorMsg());
	}

	$ncols = $res->numColumns();	//用$ncols存储总的字段数
	$res->finalize();		//关闭查询
	$ins = create_insert_stmt($table_name, $ncols);		//创建prepare的插入语句
	echo "Insert stmt:$ins\n";		//显示插入语句

	$res = $db->prepare($ins);
	$fp = new SplFileObject($file_name, 'r');

	while($row = $fp->fgetcsv()) {		//读取原始表格记录文件，$SplFileObject对象在文档结束时将返回一个空行
		if(strlen(implode('', $row)) == 0) {		//如果不加入这条语句，文档结束时的空行也会插入数据表中
			continue;
		}
		foreach(range(1, $ncols) as $i) {
			$res->bindValue(":$i", $row[$i - 1]);	//用bindValue绑定变量和占位符
		}

		$res->execute();

		if($db->lastErrorCode() != 0) {
			print_r($row);
			throw new Exception($db->lastErrorMsg());
		}

		$row_num++;
	}

	echo "$row_num rows inserted into $table_name.\n";
}
catch (Exception $e) {
	echo "Exception: \n";
	die($e->getMessage() . "\n");
}
